#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <vector>
using namespace std;
typedef long long LL;
inline int read()
{
    register int x = 0, f = 0;
    register char c = getchar();
    while (c < '0' || c > '9')
        f |= c == '-', c = getchar();
    while (c >= '0' && c <= '9')
        x = (x << 3) + (x << 1) + c - '0', c = getchar();
    return f ? -x : x;
}
int n, k;
LL dp[10][1 << 9 | 1][82];

inline int check(int sta) { return !((sta & (sta << 1)) || (sta & (sta >> 1))); }
inline int check(int sta1, int sta2) { return !((sta1 & sta2) || ((sta1 << 1) & sta2) || ((sta1 >> 1) & sta2)); }
inline int Count(int sta)   //计算这一行可以摆放几个国王
{
    int res = 0;
    for (int i = 1; i <= n; ++i)
        res += (sta >> (i - 1)) & 1;
    return res;
}

int main()
{
    n = read();
    k = read();
    dp[0][0][0] = 1;
    for (int i = 1; i <= n; ++i) // 行号
        for (int j = 0; j < (1 << n); ++j)  //枚举所有情况
            if (check(j)) // 这一行状态  两个国王之间是否相邻 （间隔一个就行了）
                for (int l = 0; l < (1 << n); ++l)
                    if (check(l) && check(j, l))     // 上一行状态 和上一行的状态不冲突   更新最大值
                        for (int s = 0; s <= k; ++s) // 总个数
                        {
                            int c = Count(j), d = Count(l);
                            if (s < c + d)           //
                                continue;
                            dp[i][j][s] += dp[i - 1][l][s - c];
                        }
    LL ans = 0;
    for (int i = 0; i < (1 << n); ++i)
        ans += dp[n][i][k];
    cout << ans << '\n';
    return 0;
}